স্প্রিং বুট ORM (Spring Boot ORM) এর মাধ্যমে ডেটাবেজে প্রশ্ন (query) করার জন্য দুটি প্রধান ধরনের কৌশল রয়েছে: Native Query এবং Named Query। এই দুটি কৌশল স্প্রিং ডেটা JPA বা Hibernate এর সাহায্যে ডেটাবেজে নির্দিষ্ট অপারেশন করতে ব্যবহৃত হয়। আসুন, আমরা এই দুটি কৌশল এবং তাদের ব্যবহার উদাহরণসহ বুঝে দেখি।
Native Query
Native Query হলো ডেটাবেজের SQL স্টাইল ব্যবহার করে কোয়েরি করার পদ্ধতি। যখন JPA বা Hibernate এর মাধ্যমে সাধারণ JPQL (Java Persistence Query Language) দিয়ে ডেটাবেজে প্রশ্ন করা হয় না, তখন Native SQL ব্যবহার করা হয়।
Native Query SQL স্টাইলের কোয়েরি ব্যবহার করতে সক্ষম করে, যেমন যে SQL কোয়েরি ডেটাবেজের জন্য বিশেষভাবে তৈরি করা হয়েছে।
Native Query এর উদাহরণ:
ধরা যাক আমাদের একটি Employee Entity ক্লাস আছে, যেখানে id, name, এবং salary ফিল্ড রয়েছে। আমরা একটি native query ব্যবহার করে salary এর ওপর ভিত্তি করে Employee তালিকা আনতে চাই।
Employee Entity ক্লাস:
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
@Entity
public class Employee {
@Id
private Long id;
private String name;
private Double salary;
// Getters and Setters
}
Native Query ব্যবহার করা:
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
public interface EmployeeRepository extends JpaRepository<Employee, Long> {
@Query(value = "SELECT * FROM Employee e WHERE e.salary > :salary", nativeQuery = true)
List<Employee> findEmployeesWithSalaryGreaterThan(@Param("salary") Double salary);
}
এখানে, @Query অ্যানোটেশন ব্যবহার করে আমরা SQL স্টাইলে কোয়েরি লিখেছি, যেখানে nativeQuery = true নির্দেশ করা হয়েছে।
ব্যবহার:
@Autowired
private EmployeeRepository employeeRepository;
public void getEmployees() {
List<Employee> employees = employeeRepository.findEmployeesWithSalaryGreaterThan(50000.0);
employees.forEach(employee -> System.out.println(employee.getName()));
}
এই কোডে, salary এর তুলনায় বড় এমন সমস্ত Employee অবজেক্ট ডেটাবেজ থেকে নিয়ে আসা হবে।
Named Query
Named Query হলো JPA-এর একটি বৈশিষ্ট্য, যা কোয়েরি লেখার জন্য নির্দিষ্ট নাম ব্যবহার করে এবং একটি কেন্দ্রীয় স্থান থেকে (যেমন Entity ক্লাসের মধ্যে) সেই কোয়েরি রেজিস্টার করে। Named Query ব্যবহার করার সময় কোয়েরি লিখে তা Entity ক্লাসের মধ্যে @Query অ্যানোটেশন বা @NamedQuery অ্যানোটেশন ব্যবহার করে সংজ্ঞায়িত করা হয়।
Named Query এর উদাহরণ:
ধরা যাক, আমাদের একটি Department Entity ক্লাস রয়েছে, যেখানে id, name এবং location ফিল্ড রয়েছে। আমরা Named Query ব্যবহার করে Department নামের ভিত্তিতে সমস্ত ডেটা পাওয়ার চেষ্টা করব।
Department Entity ক্লাস:
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.NamedQuery;
@Entity
@NamedQuery(name = "Department.findByName", query = "SELECT d FROM Department d WHERE d.name = :name")
public class Department {
@Id
private Long id;
private String name;
private String location;
// Getters and Setters
}
এখানে, @NamedQuery অ্যানোটেশন ব্যবহার করে Department.findByName নামক একটি কোয়েরি সংজ্ঞায়িত করা হয়েছে। এই Named Query কেবলমাত্র Department নামের জন্য সমস্ত রেকর্ড আনতে ব্যবহৃত হবে।
Named Query ব্যবহার করা:
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
public interface DepartmentRepository extends JpaRepository<Department, Long> {
@Query(name = "Department.findByName")
List<Department> findByName(@Param("name") String name);
}
এখানে, @Query(name = "Department.findByName") দিয়ে আমরা Department.findByName নামক Named Query ব্যবহার করেছি।
ব্যবহার:
@Autowired
private DepartmentRepository departmentRepository;
public void getDepartments() {
List<Department> departments = departmentRepository.findByName("Sales");
departments.forEach(department -> System.out.println(department.getLocation()));
}
এই কোডের মাধ্যমে আমরা Sales নামের সমস্ত Department অবজেক্ট ডেটাবেজ থেকে নিয়ে আসব।
Native এবং Named Query এর তুলনা
| বৈশিষ্ট্য | Native Query | Named Query |
|---|---|---|
| কোয়েরি ধরনের স্টাইল | SQL কোয়েরি (ডেটাবেজ নির্দিষ্ট) | JPQL (Java Persistence Query Language) |
| কোড লেখার স্থান | কোডে সরাসরি কোয়েরি লেখা হয় | Entity ক্লাসে কোয়েরি সংজ্ঞায়িত করা হয় |
| পারফরম্যান্স | সাধারণত দ্রুত, কিন্তু ডেটাবেজ নির্ভর | ডেটাবেজ নিরপেক্ষ, তবে কিছু পরিস্থিতিতে ধীর হতে পারে |
| ডেটাবেজ নির্ভরতা | ডেটাবেজ নির্দিষ্ট (RDBMS নির্ভর) | ডেটাবেজ নিরপেক্ষ (JPA নির্ভর) |
| উপযোগিতা | বিশেষ SQL ফিচার ব্যবহার করার সময় | JPQL বা সাধারণ ডেটাবেজ অপারেশন করার সময় |
সারসংক্ষেপ
- Native Query ব্যবহার করে সরাসরি SQL কোয়েরি ব্যবহার করা হয়, যা ডেটাবেজ নির্দিষ্ট এবং কিছু বিশেষ পরিস্থিতিতে কার্যকর।
- Named Query হলো JPA-এর একটি শক্তিশালী বৈশিষ্ট্য যা কোয়েরি রিফারেন্স এবং ডেটাবেজ নিরপেক্ষতা নিশ্চিত করে। এটি Entity ক্লাসে সংজ্ঞায়িত করা হয় এবং বিভিন্ন অংশে পুনঃব্যবহার করা যায়।
- যখন আপনি ডেটাবেজ নির্দিষ্ট SQL কোয়েরি ব্যবহার করতে চান, তখন Native Query ব্যবহার করুন, এবং যখন ডেটাবেজ নিরপেক্ষ, সাধারণ কোয়েরি ব্যবহার করতে চান, তখন Named Query ব্যবহার করা উচিত।
Read more